#include "include.h"

/*
	函数功能：初始化gt24l24字库芯片接口配置
    函数名称：GT_Init
*/
void GT_Init()
{
	SPI_CS_OUT		SPI_CS_1
	SPI_CLK_OUT		SPI_CLK_1
	SPI_SO_OUT		SPI_SO_1
	SPI_SI_IN
}

/*
	函数功能：读取gt24l24字库芯片的ascii码字库数据
	函数名称：ASCII_GetData
	输入：ASCIICode			ascii字符
	输入：BaseAdd			
	输入：*buffer			输出字库数据16字节
	备注：排置：Y（竖置横排）点阵大小 8X16 
*/
void ASCII_GetData(unsigned int ASCIICode,unsigned long BaseAdd,char *buffer)
{

        unsigned long BaseAddr        = 0x3b7c0;
        unsigned long WordAddr        = 0;            
        unsigned long ASCIICodeTemp   =0;
        const unsigned int BUFSIZE    = 16;        
        unsigned char  i;

        ASCIICodeTemp = ASCIICode & 0xFF;

        if((ASCIICodeTemp >= 0x20) && (ASCIICodeTemp <= 0x7E))
        {
                WordAddr = (ASCIICodeTemp - 0x20) * BUFSIZE + BaseAddr;
        }

        r_dat_bat(WordAddr,16,buffer);
}

/*
	函数功能：读取gt24l24字库芯片的gb2312编码字库数据
    函数名称：gt_16_GetData
	输入：MSB                gb2312编码高字节
	输入：LSB                gb2312编码低字节
    输出：*DZ_Data           输出字库数据32字节
*/
void gt_16_GetData(unsigned char MSB,unsigned char LSB,char *DZ_Data)
{
        unsigned long BaseAddr        = 0;       //16x16点阵的起始地址，见手册《GT20L16S1Y用户手册》
        unsigned long GBCode_MSB        = 0;   //汉字内码的高八位
        unsigned long GBCode_LSB        = 0;         //汉字内码的低八位
        unsigned long WordAddr        = 0;                      //汉字或者ASCII字符点阵在芯片中的字节地址
        const unsigned char BUFSIZE        = 32;              //缓冲区的大小
        unsigned char   i;
        // GBCode_MSB        = (GBCode >> 8) & 0xFF;   //汉字内码的高八位
        // GBCode_LSB        = GBCode & 0xFF;         //汉字内码的低八位

        GBCode_MSB        = MSB;
        GBCode_LSB        = LSB;

        //计算地址，见手册《GT20L16S1Y用户手册》

        if(GBCode_MSB == 0xA9&& GBCode_LSB >= 0xA1)
        {
                WordAddr        = (282+(GBCode_LSB-0xA1))*32+ BaseAddr;
        }
        else if(GBCode_MSB >= 0xA1&&GBCode_MSB <= 0xA3&& GBCode_LSB >= 0xA1)
        {
                WordAddr        = (GBCode_MSB-0xA1)*94+(GBCode_LSB-0xA1)*32+ BaseAddr;
        }
        else if(GBCode_MSB >= 0xB0&&GBCode_MSB <= 0xF7&& GBCode_LSB >= 0xA1)
        {
                WordAddr        = ((GBCode_MSB-0xB0)*94+(GBCode_LSB-0xA1)+846)*32+ BaseAddr;
        }


		WordAddr |= 0x0B000000;

		r_dat_bat(WordAddr,32,DZ_Data);
}

/*
	函数功能：gt24l24一般读取
    函数名称：r_dat_bat
	输入：address          读取地址   
	输入：byte_long        读取长度（字节）
    输出：*p_arr           输出字库数据32字节
*/
unsigned char r_dat_bat(unsigned int address,unsigned short byte_long, char *p_arr) 
{
	unsigned char i = 0;
	
	SPI_CS_0
	Delay_us(1);
	SPI_send(address);
	for(i = 0;i < byte_long;i ++)
		p_arr[i] = SPI_read();
	SPI_CS_1
	return 1;
}

/*
	函数功能：gt24l24读取
    返回：dat           读取的数据（1字节）
*/
unsigned char SPI_read()
{
	unsigned int i;
	unsigned char dat = 0x00;
	
	for(i = 0;i < 8;i ++)
	{
		SPI_CLK_0
		Delay_us(1);		
		dat = dat << 1;
		if(SPI_SI == 1) 
			dat = dat | 0x01;
		SPI_CLK_1
		Delay_us(1);
	}
	return dat;
}

/*
	函数功能：gt24l24发送
    输入：dat           发送的数据（32bit长度）
	备注：自动填充0x03命令码
*/
void SPI_send(unsigned int dat)
{
	unsigned int i;	
	
	dat |= 0x03000000;
	for(i = 0;i < 32;i ++)
	{
		SPI_CLK_0
		Delay_us(1);
		if((dat & 0x80000000) == 0x80000000) 
			SPI_SO_1
		else 
			SPI_SO_0
		Delay_us(1);
		SPI_CLK_1
		Delay_us(1);
		dat = dat << 1;
	}
}

































